#include "loginEroll.h"
//这个.c文件是用来实现client端的登录注册相关功能：

//salt值随机生成函数：
int generateSalt(char *salt){
    // 1. 定义可选的字符集（来自图片）
    const char charset[] =
        "abcdefghijklmnopqrstuvwxyz"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "0123456789./";
    const int charset_len = strlen(charset);

    // 2. 初始化随机种子
    srand((unsigned int)time(NULL));

    // 3. 生成前缀 "$6$"
    strcat(salt, "$6$");

    // 5. 使用 strcat 拼接中间 16 位随机字符
    for (int i = 0; i < 16; i++) {
        char random_char[2] = {0};
        random_char[0] = charset[rand() % charset_len];
        strcat(salt, random_char); // 每次拼接一个字符
    }
    // 6. 使用 strcat 拼接后缀 "$"
    strcat(salt, "$");

    return 0;
}



//错误处理函数(当数据库中没有检索到用户名时)：
//返回值: 1代表进入注册 2代表退出程序
int handleLogin1() {

    //printf("用户名不存在或密码错误\n");
    printf("请选择：\n1. 注册新用户\n2. 退出程序\n");

    int choice;
    do {
        scanf("%d", &choice);
        if(choice == 1 || choice == 2) {
            return choice; 
        }
        printf("无效输入，请重新选择(1或2):");
    } while(1);
}

int handleLogin2(char *username,MYSQL *mysql){

    printf("请重新输入密码：");
    char temppassword[256]={0};
    scanf("%s",temppassword);
    compareInfo(username,temppassword,mysql);

}


//用户信息检索函数：(判断用户名密码是否正确)
//函数返回值情况---> 0:代表登录成功；1代表进入注册功能；2代表退出程序；
int compareInfo(char *username,char *password,MYSQL *mysql){
    //printf("compareInfofunc: username=%s,password=%s\n",username,password);

    //从数据库中提取出颜值和对应用户名的密文：
    char query[1024];
    bzero(query,sizeof(query));
    //printf("username=%s\n",username);
    snprintf(query,sizeof(query),
             "SELECT username,salt,encrypted_password FROM userInfo WHERE username = '%s' limit 1",
             username);
    printf("query=%s\n",query);
    //printf("mysql_query(mysql, query)=%d\n",mysql_query(mysql, query));

    //检查搜索结果：
    if (mysql_query(mysql, query) != 0) {
        //情况1：mysql_query本身语句查询错误
        printf("程序出错!\n");
        printf("程序退出中....\n");
        exit(EXIT_FAILURE);
    }
    else {
        //情况2：mysql_query语句没问题
        MYSQL_RES *result = mysql_store_result(mysql);
        if (result == NULL || mysql_num_rows(result) == 0) {
            //没有查询到用户名，查询结果为空：
            printf("用户名不存在!\n");
            return handleLogin1();
        }

        //可以找到用户名：
        //获取库内salt和密文：
        MYSQL_ROW row = mysql_fetch_row(result);
        if (row == NULL) {
            printf("mysql_fetch_row failed!\n");
            mysql_free_result(result);
            exit(EXIT_FAILURE);
        }

        const char *salt =row[1]; 
        const char *encrypted_pass = row[2];
        char dbUsername[50]={0};
        strncpy(dbUsername, row[0], 50); // 假设用户名最长50字符

        //printf("dbUsername=%s\n",dbUsername);
        //printf("salt=%s\n",salt);
        //printf("encrypted_pass=%s\n",encrypted_pass);

        //根据salt和password生成密文：
        char *tempPassword=crypt(password,salt);
        if (tempPassword == NULL) {
            fprintf(stderr, "密码加密失败\n");
            mysql_free_result(result);
            exit(EXIT_FAILURE);
        }

        if(strcmp(tempPassword,encrypted_pass) == 0){
            //密码匹配成功：
            printf("登录成功!\n");
            return 0;
        }
        else {
            //密码匹配失败：
            printf("用户名存在，密码匹配失败\n");
            return handleLogin2(username,mysql);
        }


    }

    return 0;
}

//注册功能：
//返回值： 为0代表注册成功，回到登录界面，为1代表失败（不允许失败）; 
int erollUser(MYSQL *mysql){

    printf("注册界面：\n");
    char username[256]={0};
    bzero(username,sizeof(username));
    char password[256]={0};
    bzero(password,sizeof(password));

    //用户输入新用户的用户名和密码：
    printf("请输入新用户的用户名：");
    scanf("%s",username);

    printf("请输入新用户的密码(密码只一次,谨慎输入):");
    scanf("%s",password);

    //调用数据库，将信息存入数据库当中：
    char salt[21];
    bzero(salt,sizeof(salt));
    generateSalt(salt);

    // 加密密码（实际项目应使用更安全的哈希算法）
    char *encrypted_password = crypt(password, salt);

    // 使用预处理语句防止SQL注入
    char query[512];
    snprintf(query, sizeof(query),
             "INSERT INTO userInfo (username, salt, encrypted_password) "
             "VALUES ('%s', '%s', '%s')",
             username, salt, encrypted_password);

    if (mysql_query(mysql, query)) {
        fprintf(stderr, "注册失败: %s\n", mysql_error(mysql));
        return -1;
    }
    printf("用户 %s 注册成功！\n", username);
    return 0;

}



//注册登录整个大流程函数：
int login(MYSQL *mysql){

    while(1){
        printf("登录界面：\n");
        printf("Plz enter user name:");
        char username[1024];
        bzero(username,sizeof(username));
        scanf("%s",username);

        printf("Plz enter password:");
        char password[1024];
        bzero(password,sizeof(password));
        scanf("%s",password);

        //系统接受信息，进行信息比对: 需要一个比对信息的函数：
        //- 登录成功：返回0;
        //- 登录失败：返回1代表进入注册功能，返回2代表退出程序;
        int result=compareInfo(username,password,mysql);

        if(result == 0){
            //进入workCmd
            printf("进入workCmd\n");
            return 0;

        }
        else if(result == 1 ){
            //进入注册功能：
            printf("进入erollUser:\n");
            erollUser(mysql);

        }
        else if(result == 2){
            //代表退出程序：client端直接结束
            printf("程序退出!\n");
            exit(EXIT_FAILURE);
        } 
    }
}

